package com.atguigu.gulimall.product.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.common.utils.PageUtils;
import com.atguigu.common.utils.R;
import com.atguigu.common.utils.Query;

import com.atguigu.gulimall.product.dao.CategoryDao;
import com.atguigu.gulimall.product.entity.CategoryEntity;
import com.atguigu.gulimall.product.service.CategoryService;


@Service("categoryService")
public class CategoryServiceImpl extends ServiceImpl<CategoryDao, CategoryEntity> implements CategoryService {
//   @Autowired  第一种方法， 已经继承 CategoryServiceImpl 直接调用basemapper就好
//   CategoryDao categoryDao;
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<CategoryEntity> page = this.page(
                new Query<CategoryEntity>().getPage(params),
                new QueryWrapper<CategoryEntity>()
        );

        return new PageUtils(page);
    }
    //递归方法查询子菜单
    @Override
    public List<CategoryEntity> listWithTree() {
        //1.查出所有分类  查那个表，就用逆向生成的那个dao
        List<CategoryEntity> entities = baseMapper.selectList(null); //查询所有数据，没有特定结构
        //2.组装成父子的树形结构

         //.map()将每个菜单重新改变
        //2.1),找到所有的一级分类 filter过滤  leve1Menus一级菜单
        List<CategoryEntity> leve1Menus = entities.stream().filter(categoryEntity ->
             categoryEntity.getParentCid() == 0
        ).map((menu)->{//把当前菜单子分类，保存下来 ->箭头函数
            menu.setChildren(getChildrens(menu,entities));
            return menu;
            //sorted((menu1,menu2)->{ 菜单排序   前后菜单进行对比
        }).sorted((menu1,menu2)->{  // 2.菜单的排序 Sort可能为integer为空 空指针异常   //判断非空
            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort()); //排序方法 ，字段  第一个顺序，减去第二个顺序，给他升降序的值
        }).collect(Collectors.toList());

        return leve1Menus;
    }

    @Override
    public void removeMenuByIds(List<Long> asList) {
        //TODO  1.检查当前删除的菜单，是否被别的地方引用
        //项目用的最多是逻辑删除
        baseMapper.deleteBatchIds(asList);
    }

    //获取每一个菜单的子菜单   CategoryEntity传入的当前菜单  root当前菜单    all所有菜单
    //递归查找所有菜单的子菜单
    private List<CategoryEntity> getChildrens(CategoryEntity root,List<CategoryEntity> all){
        //过滤查找，  .map()子菜单还会又 菜单 ，需要进行排序
        //在categoryEntity,all里面。找到所有子菜单
        List<CategoryEntity> children = all.stream().filter(categoryEntity -> {//父类id 和字类id相同，说明， 字类，是父类的下层id
            return categoryEntity.getParentCid() == root.getCatId();  //当前菜单的ParentCid  等于我们指定的CatId
        }).map(categoryEntity -> {
            //1.找到子菜单
            categoryEntity.setChildren(getChildrens(categoryEntity,all));//为每个当前菜单找到子菜单
            return categoryEntity; //找到后，把当前菜单进行返回
        }).sorted((menu1,menu2)->{
            //2.菜单的排序 Sort可能为integer为空 空指针异常   //判断非空
            //(menu2.getSort()==null?0:menu2.getSort())  等于空 ？是给他一个值 设置为0。“：” 否则的意思。 否则就用这个值menu2.getSort())
            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
        }).collect(Collectors.toList());//.sorted()进行拍寻
        return children; //子菜单排好序，收集返回
    }

}
